package Personajes;

import javax.swing.*;

import Logica_Moviemientos.*;
import Mapa.Mapa_Logico;
import Objetos.Disparo;
public class Mario extends Personaje implements Runnable {
	protected ImageIcon[] imagenes,imMC,imMS,imMF;
	protected ImageIcon ultimo;
	
	protected Inteligencia_Manual inteligencia;
	protected boolean derecha, izquierda, salto, murio, estrella, invencible, bomba, dispBomba;
	protected int puntaje, vidas, tipoMario;
	protected long tiempoEstrella, tiempoInvensible;
	protected Mapa_Logico mapa;

	/**Constructor. */
	public Mario(Mapa_Logico m){
		super();
		mapa = m;
		cargarImagenes();
		grafico.modificarImagen(imagenes[0]);
		ultimo = imagenes[0];
		murio = false;
		puntaje = 0;
		vidas = 1;
		tipoMario = 0;
		estrella = false;
		invencible = false;
		bomba = false;
		dispBomba = false;
	}
	
	/**Carga las imagenes del mario en un arreglo. */
	public void cargarImagenes(){
		imMC = new ImageIcon[6];
		imMC[0] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mini-mario/mario_der.png"));
		imMC[1] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mini-mario/mario_camina_der.gif"));
		imMC[2] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mini-mario/mario_salta_der.png"));
		imMC[3] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mini-mario/mario_izq.png"));
		imMC[4] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mini-mario/mario_camina_izq.gif"));
		imMC[5] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mini-mario/mario_salta_izq.png"));	
		
		imMS = new ImageIcon[6];
		imMS[0] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/super-mario/mario_der.png"));
		imMS[1] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/super-mario/mario_camina_der.gif"));
		imMS[2] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/super-mario/mario_salta_der.png"));
		imMS[3] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/super-mario/mario_izq.png"));
		imMS[4] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/super-mario/mario_camina_izq.gif"));
		imMS[5] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/super-mario/mario_salta_izq.png"));
		
		imMF = new ImageIcon[6];
		imMF[0] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mario-flor/mario_der.png"));
		imMF[1] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mario-flor/mario_camina_der.gif"));
		imMF[2] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mario-flor/mario_salta_der.PNG"));
		imMF[3] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mario-flor/mario_izq.png"));
		imMF[4] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mario-flor/mario_camina_izq.gif"));
		imMF[5] = new ImageIcon(getClass().getResource("/Imagenes/Personajes/Mario/mario-flor/mario_salta_izq.PNG"));
	
		imagenes = imMC;
	}
	
	public int getTipo(){
		return tipoMario;
	}
	
	public void powerUP(){
		if(tipoMario == 0){
			imagenes = imMS;
			ultimo = imagenes[0];
			this.setPosicion(obtenerX(), obtenerY() - 64);
			tipoMario = 1;
		}
	}
	
	public void aFlorDeFuego(){
		if(tipoMario == 0) this.setPosicion(obtenerX(), obtenerY() - 64);
		imagenes = imMF;
		ultimo = imagenes[0];
		tipoMario = 2;
		
	}
	
	public void powerDOWN(Enemigo e){
		if(tipoMario == 0){
			setMurio(e);
		}
		else{
			setInvencible(true);
			imagenes = imMC;
			ultimo = imagenes[0];
			tipoMario = 0;
		}
	}
	
	public void setInvencible(boolean b){
		if(b == true) tiempoInvensible = System.currentTimeMillis();
		invencible = b;
	}
	
	public boolean esInvencible(){
		return invencible;
	}
	
	public int tiempoInvencible(){
		return 3 - (int)((System.currentTimeMillis() - tiempoInvensible) /1000);
	}
	
	public boolean esEstrella(){
		return estrella;
	}
	
	public void setEstrella(boolean b){
		if(b == true) tiempoEstrella = System.currentTimeMillis();
		invencible = false;
		estrella = b;
	}
	
	public int tiempoEstrella(){
		return 20 - (int)((System.currentTimeMillis() - tiempoEstrella) /1000);
	}
	
	
	/**Modifica el puntaje de mario. */
	public void setPuntaje(int i){
		puntaje += i;
	}
	
	/**Retorna el puntaje de mario. */
	public int getPuntaje(){
		return puntaje;
	}
	
	/**Modifica las vidas de mario. */
	public void setVidas(int i){
		vidas += i;
	}
	
	/**Retorna la cantidad de vidas de mario. */
	public int getVidas(){
		return vidas;
	}
	
	/**Retorna si true si mario murio, false en caso contrario. */
	public boolean murio(){
		return murio;
	}
	
	/**Modifica si el mario murio o no. */
	public void setMurio(Enemigo e){
		murio = true;
		if(e != null) this.setPuntaje(e.getPuntajeMatarMario());
		else this.setPuntaje(-15);
		vidas --;
		if(vidas > 0){
			tipoMario = 0;
			imagenes = imMC;
			ultimo = imagenes[0];
			estrella = false;
			invencible = false;
			derecha = false;
			izquierda = false;
			salto = false; 
			bomba = false;
			dispBomba = false;
			JOptionPane.showMessageDialog(null,"Has perdido una vida.",null,JOptionPane.INFORMATION_MESSAGE,null);
			murio = false;
			mapa.iniciarMapa();
		}
		else{
			String s = "Has perdido. \n Tu puntaje fue: "+this.getPuntaje()+".\n Reinicia el juego para volver a empezar.";
			JOptionPane.showMessageDialog(null,s,null,JOptionPane.INFORMATION_MESSAGE,null);
			System.exit(0);
		}
	}
	
	/**Asigna una inteligencia al personaje. */
	public void setInteligencia(Inteligencia_Manual i){
		inteligencia = i;
	}
	
	/**Retorna true si se esta moviendo a la derecha
	 * false en caso contrario. */
	public boolean getDerecha(){
		return derecha;
	}
	
	/**Setea si el personaje avanza a la derecha. */
	public void setDerecha(boolean b){
		izquierda = false;
		derecha = b;
	}
	
	/**Retorna true si se esta moviendo a la izquierda,
	 * false en caso contrario. */
	public boolean getIzquierda(){
		return izquierda;
	}
	
	/**Setea si el personaje avanza a la izquierda. */
	public void setIzquierda(boolean b){
		derecha = false;
		izquierda = b;
	}
	
	/**Retorna true si el personaje esta saltando, false en caso contrario. */
	public boolean getSalto(){
		return salto;
	}
	
	/**Setea si el personaje salta. */
	public void setSalto(boolean b){
		salto = b;
	}
	
	public void disparar(){
		if(tipoMario == 2){
			Disparo d = null;
			if(ultimo == imagenes[0]) {
				d = new Disparo(1);
				d.setPosicion(this.obtenerX() + 32, this.obtenerY() + 16);
			}
			else{
				d = new Disparo(-1);
				d.setPosicion(this.obtenerX() - 32, this.obtenerY() + 16);
			}
			mapa.obtenerItems().addLast(d);
		}
	}
	
	public boolean getBombaNuclear(){
		return bomba;
	}
	
	public void setBombaNuclear(boolean b){
		bomba = b;
	}
	
	public void dispararBombaNuclear() {
		if(bomba) dispBomba = true;
	}
	
	@Override
	public void run() {
		while( true ){
			try{
				if(!murio){
					if(dispBomba){
						inteligencia.dispararBombaNuclear();
						dispBomba = false;
					}
					if(esEstrella()){
						if(tiempoEstrella() <= 0) setEstrella(false);
					}
					if(esInvencible()){
						if(tiempoInvencible() <= 0) setInvencible(false);
					}
					if(salto && derecha && mapa.getColisiones().colisionAbajo(this)){
						if(ultimo == imagenes[0]) grafico.modificarImagen(imagenes[2]);
						else grafico.modificarImagen(imagenes[5]);
						inteligencia.saltar();
					}
					else{
						if(salto && izquierda && mapa.getColisiones().colisionAbajo(this)){
							if(ultimo == imagenes[0]) grafico.modificarImagen(imagenes[2]);
							else grafico.modificarImagen(imagenes[5]);
							inteligencia.saltar();
						}
						else{
							if(salto){
								if(ultimo == imagenes[0]) grafico.modificarImagen(imagenes[2]);
								else grafico.modificarImagen(imagenes[5]);
								inteligencia.saltar();
							}
							else{
								if(derecha){
									grafico.modificarImagen(imagenes[1]);
									ultimo = imagenes[0];
									inteligencia.moverDerecha();
								}
								else{
									if(izquierda){
										grafico.modificarImagen(imagenes[4]);
										ultimo = imagenes[3];
										inteligencia.moverIzquierda();
									}
									else{
										grafico.modificarImagen(ultimo);
									}
								}
							}
						}
					}
					grafico.modificarImagen(getRG().obtenerImagen());
					Thread.sleep(10);
					if(this.obtenerX() > 191*32) break;
				}
			}
			catch( Exception e ){
				System.out.println("Mario :: run(): "+e);
			}
		}
		
		//SI MARIO LLEGO AL FINAL DEL MAPA
		if(!this.murio()){
			while(this.posicionX != 202*32){
					grafico.modificarImagen(imagenes[1]);
					posicionX += 2;
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {}
			}
			grafico.modificarImagen(imagenes[0]);;
			JOptionPane.showMessageDialog(null,"Has ganado. Reinicia el juego.",null,JOptionPane.INFORMATION_MESSAGE,null);
			System.exit(0);
		}
	}
	
}
